package com.desire.homework;


import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class _20_统计项目代码行数 {


    public static class ProjectCountLine {
        private static final String JAVA_FILE_SUF = "java";
        private static final String CSS_FILE_SUF = "css";
        private static final String JS_FILE_SUF = "js";
        private static final String JSP_FILE_SUF = "jsp";
        private static final String HTML_FILE_SUF = "html";
        private static final String PROPERTIES_FILE_SUF = "properties";
        private static final String VM_FILE_SUF = "vm";
        // 项目的跟目录
        private File rootFile = null;
        // 项目的行数
        private long count = 0L;

        public static void main(String[] args) {
            ProjectCountLine countLine = new ProjectCountLine();
            try {
                long count = countLine.service("C:\\Users\\desire\\Desktop\\javaProject\\01-javaBase\\src\\main\\java\\com\\desire");
                System.out.println(count);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        /**
         * 入口方法
         *
         * @param path 项目的根目录路径
         * @see [类、类#方法、类#成员]
         */
        public long service(String path) throws IOException {
            boolean flag = checkPath(path);
            if (flag) {
                countFilesLine(rootFile);
            }
            return count;

        }

        /**
         * 检查文件是否是需要统计的文件类型
         *
         * @param fileName 文件的名称
         * @return true:文件为需要统计的文件; false:文件为不需要统计的文件
         * @see [类、类#方法、类#成员]
         */
        private boolean isCountFileType(String fileName) {
            if (StringUtils.isBlank(fileName)) {
                return false;
            }
            return fileName.endsWith(JAVA_FILE_SUF) || fileName.endsWith(CSS_FILE_SUF)
                    || fileName.endsWith(JS_FILE_SUF)
                    || fileName.endsWith(JSP_FILE_SUF)
                    || fileName.endsWith(HTML_FILE_SUF)
                    || fileName.endsWith(PROPERTIES_FILE_SUF)
                    || fileName.endsWith(VM_FILE_SUF);
        }

        /**
         * 检查项目的根路径是否正确
         *
         * @param path 项目路径
         * @return true:传入的路径是正确的; false:传入的路径不正确
         * @see [类、类#方法、类#成员]
         */
        private boolean checkPath(String path) {
            if (StringUtils.isBlank(path)) {
                return false;
            }
            rootFile = new File(path);
            return rootFile.exists() || rootFile.isDirectory();
        }

        /**
         * 统计指定文件下的所包含的指定格式的文件的行数
         *
         * @param file 指定文件
         * @throws IOException 文件不存在时抛出IO异常
         * @see [类、类#方法、类#成员]
         */
        private void countFilesLine(File file) throws IOException {
            File[] files = file.listFiles();
            if (null == files) {
                return;
            }
            for (File tempFile : files) {
                String fileName = tempFile.getName();
                if (fileName.endsWith("svn")) {
                    continue;
                }
                if (tempFile.isFile()) {
                    if (isCountFileType(fileName)) {
                        LineNumberReader linReader = new LineNumberReader(
                                new FileReader(tempFile));
                        linReader.skip(Long.MAX_VALUE);
                        count += linReader.getLineNumber() + 1;
                    }
                } else {
                    // 当前为File目录，则进行递归
                    countFilesLine(tempFile);
                }
            }
        }
    }
}
